package com.appleyk.security.springmvc.controller;

import com.appleyk.security.springmvc.model.AuthenticationUser;
import com.appleyk.security.springmvc.model.UserDto;
import com.appleyk.security.springmvc.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

/**
 * <p>越努力，越幸运</p>
 *
 * 基于Session的认证方式是一种常见的认证方式，至今还有非常多的系统在使用
 * 通过使用SpringMVC技术对它进行简单的实现，旨在让我们更加清晰的了解用户认证、授权以及会话的功能意义及实现套路，
 * 也就是他们分别干了哪些事情？大概需要怎么做？
 *
 * 而在正式生产项目中，我们往往会考虑使用第三方安全框架（如Spring Security，shiro等安全框架）来实现
 * 认证授权功能，因为这样做能一定程度上提高研发效率，提高软件的标准化程度，另外往往这些框架的可扩展性考虑的
 * 非常全面，但是缺点也非常明显，这些通用化组件为了提高支持范围会增加很多可能我们根本用不到的功能，且结构上
 * 比较抽象，如果我们不够了解他，一旦出现问题，将会很难定位！
 *
 * @author appleyk
 * @version V.0.1.1
 * @blob https://blog.csdn.net/appleyk
 * @date created on  7:34 下午 2021/1/3
 */
@RestController
// 返回类型是纯文本，记得编码
@RequestMapping(value = "/auth",produces = {"text/plain;charset=utf-8"})
public class LoginController {

    @Autowired
    private AuthService authService;

    // 实现认证后，使用会话功能
    @PostMapping(value = "/login")
    public String login(AuthenticationUser authUser, HttpSession session){
        UserDto userDto = authService.login(authUser);
        // 如果登录成功（认证）成功后，记得保存当前user
        session.setAttribute(userDto.getUserName(),userDto);
        return "用户名："+userDto.getUserName()+",登录成功！，用户昵称："+userDto.getAlias();
    }

    @GetMapping("/logout")
    public String logout(String userName,HttpSession session){
        // 整个服务端的会话全部失效
        //session.invalidate();
        session.removeAttribute(userName);
        return userName+",退出登录！";
    }

    // 访问资源r1
    @GetMapping("/r/r1")
    public String getResource1(String userName,HttpSession session){
        String alias = null;
        UserDto userDto = (UserDto)session.getAttribute(userName);
        if (userDto == null){
            alias = "匿名";
        }else{
            alias = userDto.getAlias();
        }
        return alias+"访问资源1";
    }

    // 访问资源r1
    @GetMapping("/r/r2")
    public String getResource2(String userName,HttpSession session){
        String alias = null;
        UserDto userDto = (UserDto)session.getAttribute(userName);
        if (userDto == null){
            alias = "匿名";
        }else{
            alias = userDto.getAlias();
        }
        return alias+"访问资源2";
    }

}
